If SDOWN=10 and(YS=>0 or GBALL=1) Then YS=-YS+JSPD : Gosub TRAMP : SPL=4 : Gosub SPL : MY=288 : BOUNCE=1 : GBALL=-1 : Sam Play RV,2 : If JSPD>-10 Then Dec JSPD
'
SX=X-144 : SY=Y-64
If SX<0 Then SX=0
If SX>640 Then SX=640
If SY<0 Then SY=0
If SY>168 Then SY=168
'
If INERT=4 and F=1 Then MSTP=(MSTP+1) mod 2 : Else MSTP=(X/16) mod 2
If X=OX Then MSTP=0
If JUMP=1 or GBALL>0 Then MSTP=1
'CALC CAMERA
XI=SX-RSX
YI=SY-RSY
If XI<0 Then RSX=RSX+(XI-10)/10
If XI>0 Then RSX=RSX+(XI+10)/10
If YI<0 Then RSY=RSY+(YI-6)/6
If YI>0 Then RSY=RSY+(YI+6)/6
If RSX<0 Then RSX=0
If RSX>640 Then RSX=640
If RSY<0 Then RSY=0
If RSY>120 Then RSY=120
Gosub FRUITS
Bob 1,X,Y,MI+MSTP
If LI>1 Then Sprite 1,192,224,MI+MSTP
If LI>2 Then Sprite 5,216,224,MI+MSTP
'
If NB=1 Then Gosub MOVEBALL
For L=0 To NBAD
On ALT(L) Gosub MOVEBLOB,MOVEREDTHING,MOVEGREENTHING,MOVEEYE,MOVESNAKE
Next L
'
Rainbow 1,RSY/2,46,172
Screen Offset 0,RSX,RSY
Wait Vbl
Bob Clear
If SDOWN>10 and SDOWN<16 and JUMP=0 Then Gosub FILBLK
If TN>0 Then Gosub TNMOVE
Bob Draw
Screen Swap
If A3000=1 Then Wait Vbl
'
Bob Clear
If SDOWN>10 and SDOWN<16 and JUMP=0 Then Gosub FILBLK : Gosub SCBLK
If TN>0 Then Gosub TNMOVE
Bob Draw
Screen Swap
Inc COUNT
If(NBLK>0 and NBLK=GOTBLK) or(I$="c") Then Goto DUNIT
Goto MAINLOOP
'
DED:
Dec LI
SPL=5
Gosub SPL
For L=0 To 50
Bob 1,X,Y,22+L mod 4
Bob Update
Wait Vbl
Next L
Bob Off 1
Bob Update
Wait Vbl
SPL=6
If LI=0 Then Gosub SPL
Screen 0
Fade 2
Wait 64
Wait Vbl
Sprite Off
Rainbow 1,0,0,0
Screen Close 1
Bob Off
Bob Update
Wait Vbl
If LI>0 Then Goto SETSCR
GAMEOVER:
Return
'
DUNIT:
Screen 0
Wait 25
Sprite Off
Wait Vbl
Bob Off
Bob Update
Wait Vbl
Screen Close 0
Screen Close 1
Inc LEV
If LEV=6 Then LEV=1
Goto SETUPLEV
'
SPRPAL:
Screen 0
Get Sprite Palette
Colour 0,0
For L=0 To 15
C(L)=Colour(L)
Colour L+16,C(L)
Next L
Screen 1
For L=0 To 15
Colour L+16,C(L)
Next L
Colour 30,0
Screen 0
Return
'
'
SETUPMAP1:
If LEV<1 Then LEV=5
If LEV>5 Then LEV=1
Screen 1
Pen 3 : Paper 0
Locate 36,2 : Print Using "#";LEV
Gosub SCORE
Screen 0
Autoback 0
NB=0 : NBLK=0 : NBAD=0
For L=0 To 11 : ALT(L)=0 : Next L
P=Start(4)+1440*(LEV-1)
For X=1 To 60
For Y=1 To 24
If SCR(X,Y)>0 and SCR(X,Y)<11 Then Paste Bob X*16-16,Y*12-12,SCR(X,Y)
If SCR(X,Y)>10 and SCR(X,Y)<16 Then Inc NBLK : Paste Bob X*16-16,Y*12-12,63
If SCR(X,Y)>110 Then Paste Bob X*16-16,Y*12-12,SCR(X,Y)-100
If Peek(P)=16 Then BX=X*16-16 : BY=Y*12-12 : NB=1
If Peek(P)>16 and Peek(P)<22 and NBAD<11 Then X(NBAD)=X*16-16 : Y(NBAD)=Y*12-12 : ALT(NBAD)=Peek(P)-16 : Inc NBAD
If SCR(X,Y)>15 and SCR(X,Y)<22 Then SCR(X,Y)=0
Inc P
Next Y
Next X
Wait Vbl
Screen Copy Logic To Physic
Wait Vbl
Return
'
SETUPSCRDAT:
P=Start(4)+1440*(LEV-1)
For X=1 To 60
For Y=1 To 24
SCR(X,Y)=Peek(P)
Inc P
Next Y
Next X
Return
'
SETUPMAP2:
If LEV<1 Then LEV=5
If LEV>5 Then LEV=1
Screen 1
Pen 3 : Paper 0
Locate 36,2 : Print Using "#";LEV
Screen 0
Autoback 0
Cls 14
P=Start(4)+1440*(LEV-1)
NB=0 : NBAD=0
For X=1 To 60
For Y=1 To 24
F=0
SCR(X,Y)=Peek(P)
If Peek(P)=16 and NB=1 Then F=1
If Peek(P)=16 Then NB=1
If Peek(P)>16 and NBAD>11 Then F=1
If Peek(P)>16 Then Inc NBAD
If F=0 and Peek(P)>0 and Peek(P)<22 Then Paste Bob X*16-16,Y*12-12,Peek(P)
Inc P
Next Y
Next X
If NBAD>12 Then NBAD=12
Rainbow 1,0,46,148
Screen Copy Logic To Physic
Wait Vbl
Gosub SPRPAL
Autoback 1
Clear Key
Return
'
SETUPSCREEN:
Auto View Off
If BGON=1 and GAME=1 Then Load Iff "AMOSPro_Productivity2:Wonderland/Landscape.Iff",0
If BGON=0 or GAME=2 Then Screen Open 0,960,288,16,Lowres : Curs Off : Cls 14
Palette 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Curs Off
Wait Vbl
Double Buffer
If GAME=1 Then Load Iff "AMOSPro_Productivity2:Wonderland/Score_Panel.Iff",1 : Screen Display 0,128,48,320,168 : Screen Display 1,128,218,320,32
If GAME=2 Then Load Iff "AMOSPro_Productivity2:Wonderland/Editor_Panel.Iff",1 : Screen Display 0,128,48,320,144 : Screen Display 1,128,194,320,32
Screen 1 : Paper 0 : Pen 3
Screen 0 : Curs Off : Flash Off
Auto View On
Return
'
MAPPER:
LEV=1
CS=1
Gosub SETUPSCREEN
Gosub SETRBOW
Gosub SETUPMAP2
Screen 1
Reserve Zone 5
Set Zone 1,7,7 To 56,24
Set Zone 2,71,7 To 120,24
Set Zone 3,135,7 To 184,24
Set Zone 4,199,7 To 240,24
Set Zone 5,247,7 To 264,24
Limit Mouse 128,48 To 448,220
Show On
MK=-1
MXS=21
I$="" : Clear Key
Repeat
I$=Lower$(Inkey$)
SCOD=Scancode
Clear Key
MC=Mouse Click
Z=Zone(1,X Mouse-128,Y Mouse-194)
If MC=1 and Z=1 Then I$="l"
If MC=1 and Z=2 Then I$="s"
If MC=1 and Z=3 Then I$="c"
If MC=1 and Z=4 Then SCOD=69
If SCOD=76 Then Gosub CSCR : Gosub PMAP : Inc LEV : Gosub SETRBOW : Gosub SETUPMAP2 : Show On
If SCOD=77 Then Gosub CSCR : Gosub PMAP : Dec LEV : Gosub SETRBOW : Gosub SETUPMAP2 : Show On
If I$="l" Then Gosub CSCR : Gosub LD : Gosub SETUPMAP2 : Show On
If I$="s" Then Gosub CSCR : Gosub PMAP : Gosub SV : Gosub SETUPMAP2 : Show On
If I$="c" Then Gosub CSCR : Gosub CLRMAP : Cls 14 : Gosub SPRPAL : Show On
If I$=" " Then RBOWSEED(LEV)=(RBOWSEED(LEV)+3) mod 64 : Hide On : Gosub SETRBOW : Show On
Wait Vbl
Sprite 1,376,203,CS
MK=Mouse Key
SX=X Mouse
SY=Y Mouse
Rainbow 1,(Min(SY,192)-48)/2,46,148
Screen Offset 0,(SX-128)*2,Min(SY-48,144)
If SX=448 Then SX=447
Screen 1
X=(SX-128)/5.33+1
Y=(SY-48)/6+1
If SCOD=78 Then Inc CS
If SCOD=79 Then Dec CS
If MC>0 and(Y>25 and X<7) Then Dec CS
If MC>0 and(Y>25 and X>9 and X<15) Then Inc CS
If CS<1 Then CS=MXS
If CS>MXS Then CS=1
If Y<25 and MK=1 Then B=CS : Gosub CHANGEBLK
If Y<25 and MK=2 Then B=0 : Gosub CHANGEBLK
Until SCOD=69
Gosub CSCR
Gosub PMAP
Screen Close 0
Screen Close 1
Return
'
LD:
M$="Select a .lev file to LOAD"
Gosub FILESEL
Bload F$,Start(4)
For L=1 To 5
RBOWSEED(L)=Peek(Start(4)+7200+L)
Next L
Return
'
SV:
M$="SAVE levels as..."
Gosub FILESEL
Bsave F$,Start(4) To Start(4)+7205
Return
'
PMAP:
If LEV<1 Then LEV=5
If LEV>5 Then LEV=1
P=Start(4)+1440*(LEV-1)
NB=0 : NBLK=0
For X=1 To 60
For Y=1 To 24
Poke P,SCR(X,Y)
Inc P
Next Y
Next X
Return
'
CSCR:
Screen 0
Sprite Off 1
Hide On
Rainbow 1,0,0,0
Cls 0
Wait Vbl
Palette 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Screen Swap
Return
'
'
CHANGEBLK:
Screen 0
OS=SCR(X,Y)
If OS=16 Then NB=0
If OS>16 and NBAD>0 Then Dec NBAD
'
If B>16 and B<>20 and(SCR(X,Y+1)=0 or Y=1) Then Return
If B>16 and NBAD>11 Then Return
If B=21 and(X>57 or X<2) Then Return
If B=16 and NB=1 Then Return
'
Ink 14 : Bar X*16-16,Y*12-12 To X*16-1,Y*12-1
If B>0 Then Paste Bob X*16-16,Y*12-12,B
SCR(X,Y)=B
If B=16 Then NB=1
If B>16 Then Inc NBAD
Return
'
'
CLRMAP:
For X=1 To 60
For Y=1 To 24
SCR(X,Y)=0
Next Y
Next X
Clear Key
NB=0 : NBLK=0 : NBAD=0
For L=0 To 11 : ALT(L)=0 : Next L
Return
'
MOVEBALL:
If GBALL=1 Then BY=BY+2
If GBALL<>1 and BY>0 and SCR(BX/16+1,BY/12+1)=0 Then Dec BY
Bob 14,BX,BY,28
Return
'
FILBLK:
SCR((X+8)/16+1,(Y+24)/12+1)=SDOWN+100
PX=(X+8)/16*16
PY=(Y+24)/12*12
Paste Bob PX,PY,SDOWN
Return
'
SCBLK:
SPL=1
Gosub SPL
SCOR=SCOR+(SDOWN-10)*10
EXSCOR=EXSCOR+(SDOWN-10)*10
Gosub SCORE
Inc GOTBLK
Return
'
GRAB:
JAV=1
XS=0 : YS=0
X=X Bob(14)
Y=Y Bob(14)+20
Return
'
DRIFT:
X=X Bob(14)
Y=Y Bob(14)+20
Return
'
TRAMP:
TNX=(X+8)/16*16
TNY=(Y+24)/12*12
TN=8
Return
'
TNMOVE:
Dec TN
Paste Bob TNX,TNY,TN(TN/2)
Return
'
'
MOVEBLOB:
If F(L)>0 Then Dec F(L) : I=38-Abs(F(L)-3) : Goto NOM
Y(L)=Y(L)+YS(L)
If Y(L)=<MY(L) Then MY(L)=Y(L)
X(L)=X(L)+XS(L)
If X(L)<0 Then X(L)=0
If X(L)>944 Then X(L)=944
If Y(L)<0 Then Y(L)=0 : YS(L)=0 : XS(L)=0
If Y(L)>288 Then Y(L)=288
S=SCR((X(L)+8)/16+1,(Y(L)+4)/12+1)
If F(L)=0 and(Y(L)+4)/12*12-4=>MY(L)-2 and(S>0 and YS(L)>0) or Y(L)=288 Then Y(L)=(Y(L)+4)/12*12-4 : Gosub INITBLOB
I=34
If YS(L)<10 Then Inc YS(L)
NOM:
If X(L)<RSX-16 or X(L)>RSX+320 or Y(L)>RSY+168 or Y(L)<RSY-16 Then Bob Off L+2 : Return
Bob L+2,X(L),Y(L)-12,I
Return
'
INITBLOB:
XS(L)=Rnd(6)-3
YS(L)=-6-Rnd(10)
F(L)=7
MY(L)=288
Return
'
MOVEREDTHING:
S1=SCR((X(L)-8)/16+1,(Y(L)/12+2))
S2=SCR((X(L)+20)/16+1,(Y(L)/12+2))
If S1=0 or X(L)=0 Then XS(L)=4
If S2=0 or X(L)=948 Then XS(L)=-4
X(L)=X(L)+XS(L)
If X(L)<RSX-16 or X(L)>RSX+320 or Y(L)>RSY+168 or Y(L)<RSY-32 Then Bob Off L+2 : Return
Bob L+2,X(L),Y(L)+2,39+(COUNT/2) mod 6
Return
INITREDTHING:
XS(L)=-4
Return
'
MOVEGREENTHING:
If F(L)=2 and Rnd(6)>0 Then Bob L+2,X(L),Y(L)-8,72 : Return
If F(L)=2 Then F(L)=0
Y(L)=Y(L)+YS(L)
If Y(L)<MY(L) Then MY(L)=Y(L)
O=X(L)
I=0
X(L)=X(L)+XS(L)
If X(L)<0 Then X(L)=0 : XS(L)=-XS(L)
If X(L)>944 Then X(L)=944 : XS(L)=-XS(L)
If Y(L)<0 Then Y(L)=0 : YS(L)=0 : XS(L)=0
If Y(L)>288 Then Y(L)=288
S=SCR((X(L)+8+XS(L)*4)/16+1,(Y(L)+4)/12+1)
If F(L)=0 and(Y(L)+4)/12*12-4=>MY(L)-2 and(S>0 and YS(L)>0) or Y(L)=288 Then Y(L)=(Y(L)+4)/12*12-4 : Gosub WGREENTHING
If(S=0 or Rnd(50)=0) and F(L)=1 Then X(L)=O : Gosub JGREENTHING : Bob L+2,X(L),Y(L)-8,72 : Return
If YS(L)<10 and F(L)=0 Then Inc YS(L)
If X(L)<RSX-16 or X(L)>RSX+320 or Y(L)>RSY+168 or Y(L)<RSY-16 Then Bob Off L+2 : Return
If F(L)=1 Then I=70+(COUNT+L) mod 2
If F(L)=0 and YS(L)<0 Then I=73
If F(L)=0 and YS(L)=>0 Then I=69
Bob L+2,X(L),Y(L)-8,I
Return
'
INITGREENTHING:
Gosub WGREENTHING
Return
'
JGREENTHING:
F=(Y(L)-Y)/8
If F<1 Then F=1
YS(L)=Max(-16,-4-Rnd(F))
If X(L)>X Then XS(L)=-Rnd(2)-1 : Else XS(L)=Rnd(2)+1
F(L)=2
I=72
MY(L)=288
Return
WGREENTHING:
If X(L)>X Then XS(L)=-2 : Else XS(L)=2
YS(L)=0
F(L)=1
Return
'
MOVEEYE:
If COUNT mod 2 Then Goto NOCHASE
If X(L)<X and XS(L)<9 Then Inc XS(L)
If X(L)>X and XS(L)>-9 Then Dec XS(L)
If Y(L)<Y and YS(L)<9 Then Inc YS(L)
If Y(L)>Y and YS(L)>-9 Then Dec YS(L)
NOCHASE:
X(L)=X(L)+XS(L)
Y(L)=Y(L)+YS(L)
If X(L)<RSX-16 or X(L)>RSX+320 or Y(L)>RSY+168 or Y(L)<RSY-16 Then Bob Off L+2 : Return
Bob L+2,X(L),Y(L),45+COUNT mod 2
Return
INITEYE:
XS(L)=0 : YS(L)=0
Return
'
MOVESNAKE:
X(L)=X(L)+XS(L)
S1=SCR((X(L)-8)/16+1,(Y(L)/12+2))
S2=SCR((X(L)+68)/16+1,(Y(L)/12+2))
If S1=0 or X(L)<0 Then XS(L)=4
If S2=0 or X(L)>896 Then XS(L)=-4
If X(L)<0 Then X(L)=0
If X(L)>896 Then X(L)=896
If X(L)<RSX-64 or X(L)>RSX+320 or Y(L)>RSY+168 or Y(L)<RSY-16 Then Bob Off L+2 : Return
If XS(L)=-4 Then Bob L+2,X(L),Y(L),47+COUNT mod 7
If XS(L)=4 Then Bob L+2,X(L),Y(L),55+COUNT mod 7
Return
INITSNAKE:
XS(L)=-4
Return
'
SCORE:
Screen 1
Locate 1,2 : Print Using "######";SCOR
If EXSCOR=>ELIFE and HEART=0 Then L=4 : Gosub INITFRUIT : HEART=1
Screen 0
Return
'
FRUITS:
For L=0 To 3+HEART
If FF(L)=>0 Then Gosub MNUM
If FF(L)<0 Then Gosub MFRUIT
Next L
R=Rnd(200)
If R<5
DX(R)=Rnd(800)+72
DY(R)=Rnd(200)+32
End If
Return
'
MFRUIT:
If FX(L)>DX(L) and FXS(L)>-10 Then Dec FXS(L)
If FX(L)<DX(L) and FXS(L)<10 Then Inc FXS(L)
If FY(L)>DY(L) and FYS(L)>-10 Then Dec FYS(L)
If FY(L)<DY(L) and FYS(L)<10 Then Inc FYS(L)
FX(L)=FX(L)+FXS(L)
FY(L)=FY(L)+FYS(L)
If Col(15+L) and FF(L)=-2 and FY(L)>-32 Then FF(L)=12 : SCOR=SCOR+FSC(L) : EXSCOR=EXSCOR+FSC(L) : SPL=2 : Gosub SPL : Gosub SCORE